
# 数据集
def loadDataSet():
    return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]


'''
    构建候选1-项集
'''
def createC1(dataset):
    C1 = []
    for transaction in dataset:
        for item in transaction:
            if not [item] in C1:
                C1.append([item])
    C1.sort()
    return [frozenset(var) for var in C1]


'''
scanD函数：
参数：
    D：数据集
    Ck：候选项集列表
    minSupport：最小支持度
功能：
    计算候选项集（Ck）中的每项在数据集合D(记录/事务)中的支持度技术（support）。
返回值：
    retList：返回满足最小支持度的项集的集合。
    supportData：所有项集支持度信息的字典。
'''
def scanD(D, Ck, minSupport):
    ssCnt = {}
    # 对于每一条transaction（事务）
    for tid in D:
        # 对于每一个候选项集candidate，检查是否是transaction的一部分
        # 即该候选candidate是否得到transaction的支持
        for candidate in Ck:
            if candidate.issubset(tid):
                ssCnt[candidate] = ssCnt.get(candidate, 0) + 1
    # 项集（事务）总数
    numItems = float(len(D))
    # （返回值定义）频繁项集
    retList = []
    # （返回值定义）频繁项集及其支持度
    supportData = {}
    for key in ssCnt:
        # 每个项集的支持度
        support = ssCnt[key] / numItems
        # 将满足最小支持度的项集，加入retList
        if support >= minSupport:
            retList.insert(0, key)
        # 汇总支持度数据
        supportData[key] = support
    return retList, supportData

if __name__ == '__main__':
    dataset = loadDataSet()
    C1 = createC1(dataset)
    D = [set(var) for var in dataset]
    L, suppData = scanD(D, C1, 0.5)
    print(suppData)